// 本文件作为koa练习，demo文件
// 1、http 缓存策略：
// 1.1、html 协商性缓存
// 1.2、js、css、img 强缓存，时间不宜过长
// 2、api 接口合并方案
// 3、koa 路由
// 4、http2、https 如何配置
// 5、oauth2、单点登录流程实例



// 核心模块
const Koa = require('koa')
import useMiddleware from "./koa/middleware"
import useRouter from "./koa/router"

// 1、新建一个 koa 实例
const app = new Koa()

// 2、使用 context(注意：不要和router同时使用)
// app.use(async (ctx) => {

//     // 3、调用 nodejs 原生的请求响应数据
//     // ctx.req
//     // ctx.res

//     // 4、接受请求数据：
//     console.log("request:", ctx.request)

//     // 5、设置响应数据，以下三种写法均可：https://koa.bootcss.com/#response
//     // ctx.response.body = html.replace("${body}", JSON.stringify(ctx.request))
//     // ctx.body = "Koa Response2" 
//     // response.body = "Koa Response3"
// })

// // 3、中间件、洋葱模型测试
// useMiddleware(app)

// // 4、路由相关(注意：不要和app.use响应同时使用)
// useRouter(app)

// 5.1、错误处理，try-catch
app.use(ctx => {
    try{
        JSON.parse("'name': '1123sf'")
        ctx.body = "ok"
        // 最外层捕获了异常事件，就不会走到error事件里面来；如果相同时使用需要在try-catch中加入emit('error')方法
        // ctx.app.emit('error', err, ctx)
    }catch (err){
        // （1）手动返回错误信息
        // ctx.response.status = 500
        // ctx.body = "服务器内部错误！" + err.message
        
        // （2）使用内置方法抛出错误
        // ctx.throw(500)
        ctx.throw(404)

    }
})

// // 5.2、错误处理，大范围捕获错误（放到最顶部，最外层；这里只是示例）
// // （1）可以将try-catch放到最外层的中间件app.use，next()放到try里面；这样可以捕获所有错误；
// // （2）注意next()下一个中间件如果是异步的，name需要await next()
// app.use(async (ctx, next) => {
//     try{
//         await next()
//     }catch (err){
//         ctx.throw(404)
//     }
// })

// 5.3、使用error事件监听全局错误处理：
// （1）可以捕获异步异常
// （2）最外层捕获了异常事件，就不会走到error事件里面来；如果相同时使用需要在try-catch中加入emit('error')方法
app.on('error', error => {
    console.log('app error：', error)
})


app.listen(3000, () => {
    console.log("http://localhost:3000")
})

